package symbol;

import java.util.HashMap;

import ast.ComplexDataSignature;
import ast.PrimaryDataSignature;

public class SymbolTable {
	// class#attr代表是某个类的某个属性，只出现在全局的表中
	public HashMap<String, SymbolTableItem> tableInfo = new HashMap<String, SymbolTableItem>();
	
	public SymbolTable() {}
	
	public void addSymbolInfo(PrimaryDataSignature declVar) {
    	assert declVar.dataType != null;
    	astPreprocessContext.getContext();
    	System.out.println(astPreprocessContext.getNowClass());
    	if (astPreprocessContext.getNowClass() != null && astPreprocessContext.getNowFunckey() == null) {
        	// 如果在类里面，但不在函数，就是属性
    		String varName = astPreprocessContext.getNowClass() + "#" + declVar.name;
    		tableInfo.put(varName, new SymbolTableItem(varName, declVar.dataType));
    	} else {
    		// 否则，在函数、类构造方法和类的方法中，就是普通的变量
        	tableInfo.put(declVar.name, new SymbolTableItem(declVar.name, declVar.dataType));
    	}
    }
	
	public void addSymbolInfo_array(ComplexDataSignature declVar) {
    	assert declVar.dataType != null;
    	astPreprocessContext.getContext();
    	if (astPreprocessContext.getNowClass() != null && astPreprocessContext.getNowFunckey() == null) {
        	// 如果在类里面，但不在函数，就是属性
    		String varName = astPreprocessContext.getNowClass() + "#" + ((PrimaryDataSignature) declVar.dataOperated).name;
    		tableInfo.put(varName, new SymbolTableItem(varName, declVar.dataType));
    	} else {
    		// 否则，在函数、类构造方法和类的方法中，就是普通的变量
    		assert declVar.dataOperated instanceof PrimaryDataSignature;
        	tableInfo.put(((PrimaryDataSignature) declVar.dataOperated).name, new SymbolTableItem(((PrimaryDataSignature) declVar.dataOperated).name, declVar.dataType));
    	}
    }
	
	public void class_addSymbolInfo(PrimaryDataSignature declVar, String classname) {
    	assert declVar.dataType != null;
    	astPreprocessContext.getContext();
    	if (astPreprocessContext.getNowClass() != null && astPreprocessContext.getNowFunckey() == null) {
        	// 如果在类里面，但不在函数，就是属性
    		String varName = astPreprocessContext.getNowClass() + "#" + declVar.name;
    		tableInfo.put(varName, new SymbolTableItem(varName, declVar.dataType));
    	} else {
    		// 否则，在函数、类构造方法和类的方法中，就是普通的变量
        	tableInfo.put(declVar.name, new SymbolTableItem(declVar.name, declVar.dataType));
    	}
    }
	
	public void class_addSymbolInfo_array(ComplexDataSignature declVar, String classname) {
    	assert declVar.dataType != null;
    	astPreprocessContext.getContext();
    	if (astPreprocessContext.getNowClass() != null && astPreprocessContext.getNowFunckey() == null) {
        	// 如果在类里面，但不在函数，就是属性
    		String varName = astPreprocessContext.getNowClass() + "#" + ((PrimaryDataSignature) declVar.dataOperated).name;
    		assert (declVar.dataOperated instanceof PrimaryDataSignature);
    		declVar.dataType = ((PrimaryDataSignature) declVar.dataOperated).dataType + "_" + String.valueOf(declVar.operation.size());
//    		System.out.println(declVar.dataType);
//    		System.out.println(((PrimaryDataSignature) declVar.dataOperated).dataType);
    		tableInfo.put(varName, new SymbolTableItem(varName, declVar.dataType));
    	} else {
    		// 否则，在函数、类构造方法和类的方法中，就是普通的变量
    		assert declVar.dataOperated instanceof PrimaryDataSignature;
        	tableInfo.put(((PrimaryDataSignature) declVar.dataOperated).name, new SymbolTableItem(((PrimaryDataSignature) declVar.dataOperated).name, declVar.dataType));
    	}
    }
	
	public SymbolTableItem getSymbolInfo(String varName) {
    	return tableInfo.get(varName);
    }
	
	public boolean containsSymbol(String varName) {
    	return tableInfo.containsKey(varName);
    }
	
	public String toString() {
		String returnString = "";
		for (String key : tableInfo.keySet()) {
			returnString += key + " : " + tableInfo.get(key).typeToString() + "\n";
		}
		return returnString;
	}
}
